package com.ruoyi.aitcommon.utils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;

import com.alibaba.fastjson.JSONArray;

import cn.hutool.core.util.StrUtil;

/**
 * 流程配置文件中$变量的处理类
 * 
 * @author Administrator
 *
 */
public class FlowParamUtils {
//	变量正则表达式,举例:${parm},\\u4e00-\\u9fa5支持中文
//	支持格式:${demoService.getDate1},此为变量
//	支持格式:${$demoService.getDate1()},此为函数调用
//	支持格式:http://${demoService.getDate1}/webservice/${$demoService.getDate1()},此为含有变量的字符串
	private static Pattern pvar = Pattern.compile("\\$\\{(\\$){0,1}[^\\$\\{\\}]+?\\}");
//	不能使用下述表达式,因为"${aaa}-${bbb}"也会识别为整体变量
//	private static Pattern pvar = Pattern.compile("\\$\\{(\\$){0,1}.+?\\}");

	private static Map<String,Object> fmap=new HashMap<String,Object>();
		

	/**
	 * 解析方法中的参数
	 * 如果是常量,直接返回.比如:字符串'AA',整数12
	 * 如果是变量,从上下文中获取值并替换.比如:"${sqldata.sql1}"
	 * 在invokeMethod中被调用
	 * @param pmap  上下文
	 * @param parms 方法中的参数
	 * @return 替换后的参数
	 * @throws Exception
	 */
	public static Object[] getMehtodParamsValue(Map<String, Object> pmap, String[] parms) throws Exception {
		Object[] parmobjs = new Object[parms.length];
		int index = 0;
		for (String parmstr : parms) {
			Object retobj = null;
			String parm = StringUtils.trimToEmpty(parmstr);
			if (JSONParamUtils.isParam(parm)) {
//        		当前参数是$变量,从context中获取变量
//				flowdata中包含flow的本地变量:params 翻译后的,extinfo 不做翻译的
//				函数中的变量,只在flow中的params和extinfo翻译,不再递归处理了
				retobj=JSONParamUtils.transParamsJSONValue(parm,pmap,false);
			} else {
//        		当前参数就是常量
				Object oparm = getMethodParamConstant(parm);
				retobj = oparm;
			}
			parmobjs[index] = retobj;
			index++;
		}
		return parmobjs;
	}

	/**
	 * 获取mothod中的常量
	 * @param parm mothod中的参数
	 * <pre>
	 * 支持类型:
     * 	'ry':字符串
     * 	true,false:布尔
     * 	2000L:长整型
     * 	316.50D:Double型
     * 	100:整形
     *  null:null
     *  NULL:null
	 * </pre>
	 * 
	 * @return
	 */
	private static Object getMethodParamConstant(String parm) {
		Object oparm = null;
		// String字符串类型，包含'
		if (StringUtils.contains(parm, "'")) {
			oparm = StringUtils.replace(parm, "'", "");
		}
		else if(StringUtils.equalsIgnoreCase(parm, "null")) {
			oparm=null;
		}
		// boolean布尔类型，等于true或者false
		else if (StringUtils.equalsIgnoreCase(parm, "true") || StringUtils.equalsIgnoreCase(parm, "false")) {
			oparm = Boolean.valueOf(parm);
		}
		// long长整形，包含L
		else if (StringUtils.containsIgnoreCase(parm, "L")) {
			oparm = Long.valueOf(StringUtils.replaceIgnoreCase(parm, "L", ""));
		}
		// double浮点类型，包含D
		else if (StringUtils.containsIgnoreCase(parm, "D")) {
			oparm = Double.valueOf(StringUtils.replaceIgnoreCase(parm, "D", ""));
		}
		// 其他类型归类为整形
		else {
			oparm = Integer.valueOf(parm);
		}
		return oparm;
	}
	
	/**
	 * 替换流程[flow]中的参数[parms]中的变量
	 * 在初始化flow时调用
	 * @param params 流程[flow]中的[params]配置
	 * @param context   上下文
	 * @return 替换变量后的parms
	 */
	public static Map<String, Object> getFlowParamsValue(Object params, Map<String, Object> context)
			throws Exception {
		final Object ret = JSONParamUtils.transParamsJSON(params, context);
		return (Map<String, Object>) ret;
	}
}
